int[] arr = new int[5]; arr[0] = 10;
ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.remove(10);
class Node { int val; Node next; Node(int val){ this.val=val; } } Node head = new Node(10); head.next = new Node(20);
Stack<Character> stack = new Stack<>(); stack.push('('); stack.pop();
Queue<Integer> queue = new LinkedList<>(); queue.offer(1); queue.poll();
HashMap<String, Integer> map = new HashMap<>(); map.put("apple", 3); map.get("apple");
왼쪽 - 부모 - 오른쪽
데이터 저장/조회 원리 : 루트부터 비교 -> 좌/우 이동
조건 : 0. 정렬 전제 필수
사용 이유 / 사용 시점 :
완전 이진 트리, 최대/최소 규칙
데이터 저장/삭제 원리 :
삽입 : 마지막 -> 부모와 비교 -> heapify-up
- 새 노드를 힙의 마지막 위치에 삽입
- 부모와 비교 (새 노드 > 부모 -> 위치 교환)
- 루트까지 반복, 조건 만족하면 종료
삭제 : 루트 제거 -> 마지막 노드 루트 - heapify-down
- 루트를 삭제 -> 마지막 노드를 루트 위치로 이동
- 자식들과 비교 (자식 중 큰 값과 swap)
- 리프까지 반복, 조건 만족하면 종료
원리 :
사용 이유 / 사용 시점 :
PriorityQueue<Integer> minHeap = new PriorityQueue<>(); minHeap.add(10); minHeap.poll();
정점(Node)과 간선으로 이루어진 자료 구조
인접 리스트 / 행렬
그래프 탐색 원리 : DFS, BFS
DFS(Depth-First Search)
boolean[] visited = new boolean[n]; void dfs(int node){ visited[node] = true; for(int next : graph[node]){ if(!visited[next]) dfs(next); } }
BFS(Breadth-First Search)
Queue<Integer> q = new LinkedList<>(); boolean[] visited = new boolean[n]; q.add(start); visited[start] = true; while(!q.isEmpty()){ int cur = q.poll(); for(int next : graph[cur]){ if(!visited[next]){ visited[next] = true; q.add(next); } } }
사용 이유 / 사용 시점 : 관계 구조 표현, 최단 경로
Queue<Integer> q = new LinkedList<>(); boolean[] visited = new boolean[n];
for(int i=0;i<n-1;i++){ int min=i; for(int j=i+1;j<n;j++) if(arr[j]<arr[min]) min=j; int tmp=arr[i]; arr[i]=arr[min]; arr[min]=tmp; }
for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ if(arr[j] > arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } }
for(int i=1;i<n;i++){ int key = arr[i]; int j = i - 1; while(j >= 0 && arr[j] > key){ arr[j+1] = arr[j]; j--; } arr[j+1] = key; }
void quickSort(int[] arr, int low, int high){ if(low < high){ int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } int partition(int[] arr, int low, int high){ int pivot = arr[high]; int i = low - 1; for(int j=low;j<high;j++){ if(arr[j] < pivot){ i++; int tmp = arr[i]; arr[i]=arr[j]; arr[j]=tmp; } } int tmp = arr[i+1]; arr[i+1]=arr[high]; arr[high]=tmp; return i+1; }
void mergeSort(int[] arr, int l, int r){ if(l < r){ int m = l + (r-l)/2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } } void merge(int[] arr, int l, int m, int r){ int n1 = m-l+1, n2 = r-m; int[] L = new int[n1]; int[] R = new int[n2]; for(int i=0;i<n1;i++) L[i] = arr[l+i]; for(int j=0;j<n2;j++) R[j] = arr[m+1+j]; int i=0,j=0,k=l; while(i<n1 && j<n2){ if(L[i]<=R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while(i<n1) arr[k++] = L[i++]; while(j<n2) arr[k++] = R[j++]; }
void heapSort(int[] arr){ int n = arr.length; // 힙 구성 for(int i=n/2-1;i>=0;i--) heapify(arr,n,i); // 루트 제거 + heapify 반복 for(int i=n-1;i>=0;i--){ int tmp = arr[0]; arr[0]=arr[i]; arr[i]=tmp; heapify(arr,i,0); } } void heapify(int[] arr, int n, int i){ int largest = i; int l = 2*i + 1; int r = 2*i + 2; if(l<n && arr[l]>arr[largest]) largest = l; if(r<n && arr[r]>arr[largest]) largest = r; if(largest != i){ int tmp = arr[i]; arr[i]=arr[largest]; arr[largest]=tmp; heapify(arr,n,largest); } }
선형 탐색
for(int i=0;i<n;i++){ if(arr[i] == target) return i; }
이진 탐색
int low = 0, high = n-1; while(low <= high){ int mid = (low+high)/2; if(arr[mid] == target) return mid; else if(arr[mid] < target) low = mid+1; else high = mid-1; }
int[] dp = new int[n]; Arrays.fill(dp,1); for(int i=1;i<n;i++) for(int j=0;j<i;j++) if(arr[i]>arr[j]) dp[i]=Math.max(dp[i], dp[j]+1);
int[] coins={500,100,50,10}; int change=760; for(int c: coins){ int cnt=change/c; change-=cnt*c; }
void dfs(int row){ for(int col=0;col<n;col++){ if(isValid(row,col)){ board[row][col]=1; dfs(row+1); board[row][col]=0; } } }